import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import { Logger, ValidationPipe } from '@nestjs/common';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { ConfigService } from '@nestjs/config';
import { join } from 'path';
import { AppModule } from './app/app.module';
import { JcResponse, JcExceptionFilter } from './common';
import type { ISwaggerConfig } from 'src/common/config/swagger.config';

// 定义端口号，从环境变量中获取，如果没有则默认为3000
const port = +process.env.LISTEN_PORT || 3000;
// 创建一个Logger实例，用于记录日志
const logger = new Logger('main.ts');

// const { SWAGGER_API_URL, SWAGGER_TITLE, SWAGGER_DESCRIPTION, SWAGGER_VERSION } =
//   process.env;

// 异步函数，用于启动应用程序
async function bootstrap() {
  // 创建应用程序实例
  const app = await NestFactory.create<NestExpressApplication>(AppModule);

  // 设置全局前缀，将所有路由添加到/api/前缀下
  app.setGlobalPrefix('api');

  const configService = app.get(ConfigService);
  const { title, description, version, apiUrl } =
    configService.get<ISwaggerConfig>('swagger');

  // 创建Swagger文档配置
  const options = new DocumentBuilder()
    .setTitle(title)
    .setDescription(description)
    .setVersion(version)
    .addBearerAuth()
    .build();
  // 创建Swagger文档
  const document = SwaggerModule.createDocument(app, options);
  // 设置Swagger文档路由
  SwaggerModule.setup(apiUrl, app, document);

  // 全局拦截器,统一相应拦截，返回给前端数据的统一格式
  app.useGlobalInterceptors(new JcResponse());

  // 使用全局过滤器，将JcExceptionFilter实例添加到全局过滤器中
  app.useGlobalFilters(new JcExceptionFilter());

  // 使用全局管道，将验证管道添加到应用程序中
  app.useGlobalPipes(new ValidationPipe());

  // 使用静态资源，将public文件夹下的资源作为静态资源
  app.useStaticAssets(join(__dirname, 'images'), {
    // 设置静态资源的路径前缀为/static/
    prefix: '/static/'
  });

  // 监听3000端口
  await app.listen(port);

  // 打印应用程序运行地址
  logger.log(`listen in: http://localhost:${port}`);
  // 打印Swagger文档地址
  logger.log(
    `Application swagger is running on: ${await app.getUrl()}/${apiUrl}`
  );
}
// 调用启动函数
bootstrap();
